import router from './router'
import store from './store'
import { Message } from 'element-ui'//消息提示组件，在用户操作后显示提示信息
import NProgress from 'nprogress' // progress bar 页面跳转时显示一个进度条
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'//根据路由的元信息设置页面标题

NProgress.configure({ showSpinner: false }) // NProgress Configuration

// 白名单，无需登录即可访问的页面
const whiteList = ['/login'] // no redirect whitelist

// 路由前置守卫router.beforeEach
router.beforeEach(async (to, from, next) => {
  // start progress bar
  NProgress.start()

  // set page title 根据目标路由的meta信息设置页面的标题。
  document.title = getPageTitle(to.meta.title)

  // determine whether the user has logged in 检查cookie是否存在有效的token
  const hasToken = getToken()

  if (hasToken) {
    if (to.path === '/login') {
      // if is logged in, redirect to the home page
      //如果存在token且目标路由是/login，则直接跳转到主页
      next({ path: '/' })
      NProgress.done()
    } else {
      //如果已经存在token并且不是/login路由，检查Vuex状态中是否已经获取了用户信息
      const hasGetUserInfo = store.getters.name
      //如果Vuex中已经有了用户信息，则直接放行
      if (hasGetUserInfo) {
        next()
      } else {
        // 如果没有获取，则尝试通过store.dispatch('user/getInfo')获取用户信息
        try {
          // get user info
          await store.dispatch('user/getInfo')//⭐⭐⭐临时不获取用户信息，直接放行
          await store.dispatch('data/getTypes')//⭐⭐⭐获取数据类型
          // 如果获取成功，则允许跳转
          next()
        } catch (error) {
          // remove token and go to login page to re-login
          //如果获取失败，则重置token（通过store.dispatch('user/resetToken')）
          await store.dispatch('user/resetToken')//清除token
          Message.error(error || 'Has Error')//显示错误消息，
          next(`/login?redirect=${to.path}`)//重定向到登录页面
          NProgress.done()//结束进度条
        }
      }
    }
  } else {
    /* has no token*/
    //检查目标路由是否在白名单列表中。
    if (whiteList.indexOf(to.path) !== -1) {
      // in the free login whitelist, go directly 如果在，则允许跳转。
      next()
    } else {
      // 如果不在，则将用户重定向到登录页面，并传递当前路由路径作为参数。
      // other pages that do not have permission to access are redirected to the login page.
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

//这是一个全局的后置路由钩子，每次路由跳转结束后都会执行其中的逻辑。
router.afterEach(() => {
  // finish progress bar 在路由跳转完成时关闭进度条。
  NProgress.done()
})
